/******************************************************************
 * @version      : 1.0
 * @Author       : zhl
 * @Date         : 2023-08-21 13:48:38
 * @LastEditors  : zhl
 * @E-Mail       : zhll168@163.com
 * @Description  : 业务描述
 ******************************************************************/
#ifndef __APDU_H__
#define __APDU_H__

#include <stdint.h>
#include <stdlib.h>
#include <strings.h>

#ifdef __cpluscplus
extern "C"{
#endif

#define APDU_MAX_LEN  10000
#define FRAME_MAX_LEN 10240


/**---------------------------------------------------------*/
/**标签*/
typedef enum _LINK_APDU_TAG{
    LINK_REQUEST    = 1,    //预连接请求 [2]
    LINK_RESPONSE   = 129   //预连接响应 [129] 
}LINK_APDU_TAG;

typedef enum _SECURITY_APDU_TAG{
    SECURITY_REQUEST    = 16,   //安全请求 [16]
    SECURITY_RESPONSE   = 144   //安全响应 [144] 
}SECURITY_APDU_TAG;

typedef enum _CLIENT_APDU_TAG{
    CLIENT_CONNECT_REQUEST    = 2,   //建立应用连接请求 [2]
    CLIENT_RELEASE_REQUEST    = 3,   //断开应用连接请求 [3] 
    CLIENT_GET_REQUEST        = 5,   //读取请求 [5]
    CLIENT_SET_REQUEST        = 6,   //设置请求 [6]
    CLIENT_ACTION_REQUEST     = 7,   //操作请求 [7]
    CLIENT_REPORT_RESPONSE    = 8,   //上报应答 [8]
    CLIENT_PROXY_REQUEST      = 9,   //代理请求 [9]
    CLIENT_ERROR_RESPONSE     = 110  //异常响应 [110] 
}CLIENT_APDU_TAG;

typedef enum _SERVER_APDU_TAG{
    SERVER_CONNECT_RESPONSE     = 130,    //建立应用连接响应
    SERVER_RELEASE_RESPONSE     = 131,    //断开应用连接响应
    SERVER_RELEASE_NOTIFICATION = 132,    //断开应用连接通知
    SERVER_GET_RESPONSE         = 133,    //读取响应
    SERVER_SET_RESPONSE         = 134,    //设置响应
    SERVER_ACTION_RESPONSE      = 135,    //操作响应
    SERVER_REPORT_NOTIFICATION  = 136,    //上报通知
    SERVER_PROXY_RESPONSE       = 137,    //代理响应
    SERVER_ERROR_RESPONSE       = 238     //异常响应
}SERVER_APDU_TAG;

typedef enum _ACTION_REQUEST_TYPE{
    ACTION_REQUEST_NORMAL      =1,           //请求操作一个对象方法
    ACTION_REQUEST_NORMAL_LIST = 2,          //请求操作若干个对象方法
    ACTION_THEN_GET_REQUEST_NORMAL_LIST = 3  //请求操作若干个对象方法后读取若干个对象属性
}ACTION_REQUEST_TYPE;

typedef enum _ACTION_RESPONSE_TYPE{
    ACTION_RESPONSE_NORMAL      =1,           //操作一个对象方法的响应
    ACTION_RESPONSE_NORMAL_LIST = 2,          //操作若干个对象方法的响应
    ACTION_THEN_GET_RESPONSE_NORMAL_LIST = 3  //操作若干个对象方法后读取若干个属性的响应
}ACTION_RESPONSE_TYPE;

typedef enum _GET_REQUEST_TYPE{
    GET_REQUEST_NORMAL       = 1,    //读取一个对象属性
    GET_REQUEST_NORMAL_LIST  = 2,    //读取若干个对象属性
    GET_REQUEST_RECORD       = 3,    //读取一个记录型对象属性
    GET_REQUEST_RECORD_LIST  = 4,    //读取若干个记录型对象属性
    GET_REQUEST_NEXT         = 5,    //读取分帧传输的下一帧
    GET_REQUEST_MD5          = 6     //读取一个对象属性的 MD5 值
}GET_REQUEST_TYPE;

typedef enum _GET_RESPONSE_TYPE{
    GET_RESPONSE_NORMAL       = 1,    //读取一个对象属性的响应
    GET_RESPONSE_NORMAL_LIST  = 2,    //读取若干个对象属性的响应
    GET_RESPONSE_RECORD       = 3,    //读取一个记录型对象属性的响应
    GET_RESPONSE_RECORD_LIST  = 4,    //读取若干个记录型对象属性的响应
    GET_RESPONSE_NEXT         = 5,    //读取分帧传输的下一帧的响应
    GET_RESPONSE_MD5          = 6     //读取一个对象属性的 MD5 值的响应
}GET_RESPONSE_TYPE;

typedef enum _PROXY_REQUEST_TYPE{
    PROXY_GET_REQUEST_LIST             = 1,   //请求代理读取若干个服务器的若干个对象属性
    PROXY_GET_REQUEST_RECORD           = 2,   //请求代理读取一个服务器的一个记录型对象属性
    PROXY_SET_REQUEST_LIST             = 3,   //请求代理设置若干个服务器的若干个对象属性
    PROXY_SET_THEN_GET_REQUEST_LIST    = 4,   //请求代理设置后读取若干个服务器的若干个对象属性
    PROXY_ACTION_REQUEST_LIST          = 5,   //请求代理操作若干个服务器的若干个对象方法
    PROXY_ACTION_THEN_GET_REQUEST_LIST = 6,   //请求代理操作后读取若干个服务器的若干个对象方法和属性
    PROXY_TRANS_COMMAND_REQUEST        = 7    //请求代理透明转发命令
}PROXY_REQUEST_TYPE;

typedef enum _PROXY_RESPONSE_TYPE{
    PROXY_GET_RESPONSE_LIST             = 1,   //代理读取若干个服务器的若干个对象属性的响应
    PROXY_GET_RESPONSE_RECORD           = 2,   //代理读取一个服务器的一个记录型对象属性的响应
    PROXY_SET_RESPONSE_LIST             = 3,   //代理设置若干个服务器的若干个对象属性的响应
    PROXY_SET_THEN_GET_RESPONSE_LIST    = 4,   //代理设置后读取若干个服务器的若干个对象属性的响应
    PROXY_ACTION_RESPONSE_LIST          = 5,   //代理操作若干个服务器的若干个对象方法的响应
    PROXY_ACTION_THEN_GET_RESPONSE_LIST = 6,   //代理操作后读取若干个服务器的若干个对象方法和属性的响应
    PROXY_TRANS_COMMAND_RESPONSE        = 7    //代理透明转发命令的响应
}PROXY_RESPONSE_TYPE;

typedef enum _REPORT_NOTIFICATION_TYPE{
    REPORT_NOTIFICATION_LIST = 1,         //通知上报若干个对象属性
    REPORT_NOTIFICATION_RECORD_LIST = 2,  //通知上报若干个记录型对象属性
    REPORT_NOTIFICATION_TRANS_DATA  = 3   //通知上报透明数据
}REPORT_NOTIFICATION_TYPE;

typedef enum _REPORT_RESPONSE_TYPE{
    REPORT_RESPONSE_LIST = 1,         //通知上报若干个对象属性
    REPORT_RESPONSE_RECORD_LIST = 2,  //通知上报若干个记录型对象属性
    REPORT_RESPONSE_TRANS_DATA  = 3   //通知上报透明数据
}REPORT_RESPONSE_TYPE;

typedef enum _SET_REQUEST_TYPE{
    SET_REQUEST_NORMAL      =1,           //请求设置一个对象属性
    SET_REQUEST_NORMAL_LIST = 2,          //请求设置若干个对象属性
    SET_THEN_GET_REQUEST_NORMAL_LIST = 3  //请求设置后读取若干个对象属性
}SET_REQUEST_TYPE;

typedef enum _SET_RESPONSE_TYPE{
    SET_RESPONSE_NORMAL      =1,           //设置一个对象属性的响应
    SET_RESPONSE_NORMAL_LIST = 2,          //设置若干个对象属性的响应
    SET_THEN_GET_RESPONSE_NORMAL_LIST = 3  //设置后读取若干个对象属性的响应
}SET_RESPONSE_TYPE;
/**---------------------------------------------------------*/
/**数据*/
typedef struct _PIID_FIELDS{
    unsigned char       sn:6;
    unsigned char  reserve:1;
    unsigned char priority:1;
}PIID_FIELDS;

typedef union _PIID{
    PIID_FIELDS fields;
    unsigned char value;
}PIID;

typedef struct _PIID_ACD_FIELDS{
    unsigned char       sn:6;
    unsigned char      acd:1;
    unsigned char priority:1;
}PIID_ACD_FIELDS;

typedef union _PIID_ACD{
    PIID_ACD_FIELDS fields;
    unsigned char value;
}PIID_ACD;

typedef struct _OAD_TYPE{
    uint16_t OI;
    uint8_t  id;
    uint8_t  index;
}OAD_TYPE;

typedef struct _OAD{
    OAD_TYPE oad;
    uint8_t  value[4];
}OAD;

typedef enum _TIME_UNIT{
    TIME_UNIT_SECOND = 0,
    TIME_UNIT_MINUTE = 0,
    TIME_UNIT_HOUR   = 0,
    TIME_UNIT_DAY    = 0,
    TIME_UNIT_MONTH  = 0,
    TIME_UNIT_YEAR   = 0
}TIME_UNIT;

typedef struct _TI{
    TIME_UNIT unit;
    uint16_t  interval;
}TI;

typedef struct _DATE_TIME_S{
    uint16_t year;
    uint8_t  month;
    uint8_t  day;
    uint8_t  hour;
    uint8_t  minute;
    uint8_t  second;
}DATE_TIME_S;
/**
 * @brief 访问异常码
 */
typedef enum _DAR{
    DATA_ACCESS_RESULT_SUCCESSE  = 0,  //成功
    DATA_ACCESS_RESULT_HW_FAILED  = 1, //硬件失效
    DATA_ACCESS_RESULT_TEMP_FAILED  = 2, //暂时失效
    DATA_ACCESS_RESULT_REFUSE_RW  = 3, //拒绝读写
    DATA_ACCESS_RESULT_OBJ_UNDEFINED  = 4, //对象未定义
    DATA_ACCESS_RESULT_OBJ_FUNC_MISMATCH = 5, //对象接口类不符合
    DATA_ACCESS_RESULT_OBJ_NOT_EXISTS = 6,   //对象不存在
    DATA_ACCESS_RESULT_TYPE_MISMATCH  = 7,   //类型不匹配
    DATA_ACCESS_RESULT_OUT_OF_RANGE  = 8, // 越界 （8）
    DATA_ACCESS_RESULT_DATA_BLOCK_NOT_AVAILABLE  = 9, // 数据块不可用
    DATA_ACCESS_RESULT_NEXT_FRAME_CANCEL  = 10, // 分帧传输已取消
    DATA_ACCESS_RESULT_NO_NEXT_FRAME  = 11, // 不处于分帧传输状态
    DATA_ACCESS_RESULT_WRITE_BLOCK_CANCEL = 12, // 块写取消
    DATA_ACCESS_RESULT_NO_WRITE_BLOCK  = 13, // 不存在块写状态
    DATA_ACCESS_RESULT_DATA_BLOCK_INVALID  = 14,// 数据块序号无效
    DATA_ACCESS_RESULT_UNAUTHORIZED  = 15,  // 密码错/未授权
    DATA_ACCESS_RESULT_COMM_RATE_MODIFY_DISABLE  = 16, // 通信速率不能更改
    DATA_ACCESS_RESULT_YEAR_ZONE_EXCEED  = 17, // 年时区数超
    DATA_ACCESS_RESULT_DAY_PERIOD_EXCEED = 18, // 日时段数超
    DATA_ACCESS_RESULT_TARIF_EXCEED = 19, // 费率数超
    DATA_ACCESS_RESULT_SECURITY_AUTH_MISMATCH  = 20, // 安全认证不匹配 
    DATA_ACCESS_RESULT_REPEAT_RECHARGE = 21, // 重复充值
    DATA_ACCESS_RESULT_DATA_ESAM_VALIDATION_FAILED  = 22, // ESAM 验证失败
    DATA_ACCESS_RESULT_SECURITY_AUTH_FAILED  = 23, // 安全认证失败
    DATA_ACCESS_RESULT_CUSTOMER_ID_MISMATCH  = 24, /// 客户编号不匹配
    DATA_ACCESS_RESULT_RECHARGE_COUNT_ERROR = 25, // 充值次数错误
    DATA_ACCESS_RESULT_ELECTRICITY_OUT_HOARDING   = 26, // 购电超囤积
    DATA_ACCESS_RESULT_ADDR_ERROR  = 27, // 地址异常
    DATA_ACCESS_RESULT_SYMMETRY_SECURITY_ERROR = 28, // 对称解密错误
    DATA_ACCESS_RESULT_ASYMMETRY_SECURITY_ERROR = 29, // 非对称解密错误
    DATA_ACCESS_RESULT_SIGNATURE_SECURITY_ERROR = 30, // 签名错误
    DATA_ACCESS_RESULT_METER_HANGING = 31, // 电能表挂起
    DATA_ACCESS_RESULT_TIMESTAMP_INVALID  = 32, // 时间标签无效
    DATA_ACCESS_RESULT_REQUEST_TIMEOUT  = 33, // 请求超时
    DATA_ACCESS_RESULT_ESAM_P1P2_ERROR  = 34, // ESAM 的 P1P2 不正确
    DATA_ACCESS_RESULT_ESAM_LC_ERROR  = 35, // ESAM 的 LC 错误
    DATA_ACCESS_RESULT_OTHER_ERROR = 255 // 其它
}DAR;
/**数据部分结束*/
/*----------------------------------------------*/
/*预连接 开始*/

typedef enum _LINK_REQUEST_TYPE{
    LINK_REQ_LOGIN     = 0,      //登录
    LINK_REQ_HEARTBEAT = 1,      //心跳
    LINK_REQ_LOGOUT    = 2       //退出登录
}LINK_REQUEST_TYPE;

typedef struct _LINK_RESPONSE_RESULT_FIELDS{
    unsigned char        result:3;     //0：成功， 1：地址重复， 2：非法设备， 3：容量不足，其它值：保留
    unsigned char      reserve3:1;
    unsigned char      reserve4:1;
    unsigned char      reserve5:1;
    unsigned char      reserve6:1;
    unsigned char       trusted:1;    //0：不可信， 1：可信。
}LINK_RESPONSE_RESULT_FIELDS;

typedef union _LINK_RESPONSE_RESULT{
    LINK_RESPONSE_RESULT_FIELDS  fields;
    uint8_t value;
}LINK_RESPONSE_RESULT;

typedef struct _LINK_REQUEST_FRAME{
    PIID_ACD          piid;               //服务序号-优先级-ACD
    LINK_REQUEST_TYPE type;               //请求类型
    uint16_t          heartbeat_interval; //心跳周期
    unsigned char     req_datetime[10];   //请求时间
}LINK_REQUEST_FRAME;

typedef struct _LINK_RESPONSE_FRAME{
    PIID       piid;                //服务序号-优先级
    LINK_RESPONSE_RESULT result;    //结果
    unsigned char req_datetime[10]; //请求时间请求时间
    unsigned char rcv_datetime[10]; //收到时间
    unsigned char rsp_datetime[10]; //响应时间
}LINK_RESPONSE_FRAM;

/*预连接 结束*/
/*----------------------------------------------*/


/*----------------------------------------------*/
/*建立应用连接 开始*/
typedef enum _CONNECT_MECHANISM_INFO_TYPE{
    CONNECT_MECHANISM_NULL_SECURITY      = 0, //公共连接 [0] NullSecurity，
    CONNECT_MECHANISM_PWD_SECURITY       = 1, //一般密码 [1] PasswordSecurity，
    CONNECT_MECHANISM_SYMMETRY_SECURITY  = 2, //对称加密 [2] SymmetrySecurity，
    CONNECT_MECHANISM_SIGNATURE_SECURITY = 3, //数字签名 [3] SignatureSecurity
}CONNECT_MECHANISM_INFO_TYPE;

typedef struct _CONNECT_MECHANISM_INFO{
    CONNECT_MECHANISM_INFO_TYPE  tag; 
    uint8_t cipher[2048];                   //密文，tag为一般密码时，此处存放密码
    uint8_t signature[2048];                //客户机签名
    _CONNECT_MECHANISM_INFO(){
        tag = CONNECT_MECHANISM_NULL_SECURITY;
        bzero(cipher, sizeof(cipher));
        bzero(signature, sizeof(signature));
    }
}CONNECT_MECHANISM_INFO;

typedef struct _PROTOCOL_CONFORMANCE_FIELDS{
    uint8_t       app_association:1;  //应用连接协商 Application Association （0），
    uint8_t            get_normal:1;  //请求对象属性 Get Normal （1），
    uint8_t         get_with_list:1;  //批量请求基本对象属性 Get With List （2），
    uint8_t            get_record:1;  //请求记录型对象属性 Get Record （3），
    uint8_t             get_proxy:1;  //代理请求对象属性 Get Proxy （4），
    uint8_t      get_proxy_record:1;  //代理请求记录型对象属性 Get Proxy Record （5），
    uint8_t   get_subsequent_rame:1;  //请求分帧后续帧 Get Subsequent Frame （6），
    uint8_t            set_normal:1;  //设置基本对象属性 Set Normal （7），
    uint8_t         set_with_list:1;  //批量设置基本对象属性 Set With List （8），
    uint8_t          set_with_get:1;  //设置后读取 Set With Get （9），
    uint8_t             set_proxy:1;  //代理设置对象属性 Set Proxy （10），
    uint8_t    set_proxy_with_get:1;  //代理设置后读取对象属性 Set Proxy With Get （11），
    uint8_t         action_normal:1;  //执行对象方法 Action Normal （12），
    uint8_t      action_with_list:1;  //批量执行对象方法 Action With List （13），
    uint8_t action_read_with_list:1;  //执行方法后读取 Action With List （14），
    uint8_t          action_proxy:1;  //代理执行对象方法 Action Proxy （15），
    uint8_t action_proxy_with_get:1;  //代理执行后读取 Action Proxy With Get （16），
    uint8_t   active_event_report:1;  //事件主动上报 Active Event Report （17），
    uint8_t         follow_report:1;  //事件尾随上报 （18)，
    uint8_t        action_req_acd:1;  //事件请求访问位 ACD 上报 （19)，
    uint8_t             sub_frame:1;  //分帧数据传输 （20），
    uint8_t              reserve1:3;  //保留
    uint8_t              reserve2:7;  //保留
    uint8_t security_transmission:1;  //安全方式传输 （31），
    uint8_t              ID0_READ:1;  //对象属性 ID 为 0 的读取访问 （32），
    uint8_t             ID0_VISIT:1;  //对象属性 ID 为 0 的设置访问 （33）
    uint8_t              reserve3:6;  //保留
    uint8_t              reserve4:8;  //保留
    uint8_t              reserve5:8;  //保留
    uint8_t              reserve6:8;  //保留
    _PROTOCOL_CONFORMANCE_FIELDS(){
        app_association = 1;
        get_normal = 1;
        get_with_list = 1;
        get_record = 1;
        get_proxy = 1;
        get_proxy_record = 1;
        get_subsequent_rame = 1;
        set_normal = 1;
        set_with_list = 1;
        set_with_get = 1;
        set_proxy = 1;
        set_proxy_with_get = 1;
        action_normal = 1;
        action_with_list = 1;
        action_read_with_list = 1;
        action_proxy = 1;
        action_proxy_with_get = 1;
        active_event_report = 1;
        follow_report = 1;
        action_req_acd = 1;
        sub_frame = 1;
        reserve1 = 0;
        reserve2 = 0;
        security_transmission = 1;
        ID0_READ = 1;
        ID0_VISIT = 1;
        reserve3 = 0;
        reserve4 = 0;
        reserve5 = 0;
        reserve6 = 0;
    }
}PROTOCOL_CONFORMANCE_FIELDS;

typedef union _PROTOCOL_CONFORMANCE{
    PROTOCOL_CONFORMANCE_FIELDS fields;
    uint8_t value[8];
    _PROTOCOL_CONFORMANCE(){
        
    }
}PROTOCOL_CONFORMANCE;

typedef struct _FUNCTION_CONFORMANCE_FIELDS{
    uint8_t          electric_energy_meter:1; //电能量计量   （0），
    uint8_t      bidirectional_power_meter:1; //双向有功计量 （1），
    uint8_t           reactive_power_meter:1; //无功电能计量 （2），
    uint8_t           apparent_power_meter:1; //视在电能计量 （3），
    uint8_t                   ctive_demand:1; //有功需量    （4），
    uint8_t                reactive_demand:1; //无功需量    （5），
    uint8_t                apparent_demand:1; //视在需量    （6），
    uint8_t                  multiple_rate:1; //复费率     （7），
    uint8_t                  valve_control:1; //阀控       （8），
    uint8_t             local_cost_control:1; //本地费控 （9），
    uint8_t            remote_cost_control:1; //远程费控 （10），
    uint8_t    fundamental_electric_energy:1; //基波电能 （11），
    uint8_t       harmonic_electric_energy:1; //谐波电能 （12），
    uint8_t               harmonic_content:1; //谐波含量 （13），
    uint8_t            waveform_distortion:1; //波形失真度 （14），
    uint8_t  multifunction_terminal_output:1; //多功能端子输出 （15），
    uint8_t                   event_record:1; //事件记录 （16），
    uint8_t                   event_report:1; //事件上报 （17），
    uint8_t        temperature_measurement:1; //温度测量 （18），
    uint8_t                 status_monitor:1; //状态量监测 （19），
    uint8_t         communication_ethernet:1; //以太网通信 （20），
    uint8_t        communication_infra_red:1; //红外通信 （21），
    uint8_t        communication_bluetooth:1; //蓝牙通信 （22），
    uint8_t                    multi_media:1; //多媒体采集 （23），
    uint8_t                        reserve:1; //保留 （24），
    uint8_t             dc_analog_quantity:1; //直流模拟量 （25），
    uint8_t         weak_current_interface:1; //弱电端子 12V 输出 （26），
    uint8_t          search_electric_meter:1; //搜表 （27），
    uint8_t       three_phase_load_balance:1; //三相负载平衡 （28），
    uint8_t                         update:1; //升级 （29）
    uint8_t                       reserve1:2; //保留
    uint32_t                      reserve2:32; //保留
    uint32_t                      reserve3:32; //保留
    uint32_t                      reserve4:32; //保留

    _FUNCTION_CONFORMANCE_FIELDS(){
        electric_energy_meter = 1;
        bidirectional_power_meter = 1;
        reactive_power_meter = 1;
        apparent_power_meter = 1;
        ctive_demand = 1;
        reactive_demand = 1;
        apparent_demand = 1;
        multiple_rate = 1;
        valve_control = 1;
        local_cost_control = 1;
        remote_cost_control = 1;
        fundamental_electric_energy = 1;
        harmonic_electric_energy = 1;
        harmonic_content = 1;
        waveform_distortion = 1;
        multifunction_terminal_output = 1;
        event_record = 1;
        event_report = 1;
        temperature_measurement = 1;
        status_monitor = 1;
        communication_ethernet = 1;
        communication_infra_red = 0;
        communication_bluetooth = 1;
        multi_media = 0;
        reserve = 0;
        dc_analog_quantity = 1;
        weak_current_interface = 1;
        search_electric_meter = 1;
        three_phase_load_balance = 1;
        update = 1;
        reserve1 = 0;
        reserve2 = 0;
        reserve3 = 0;
        reserve4 = 0;
    }
}FUNCTION_CONFORMANCE_FIELDS;

typedef union _FUNCTION_CONFORMANCE{
    FUNCTION_CONFORMANCE_FIELDS fields;
    uint8_t value[16];
    _FUNCTION_CONFORMANCE(){
        
    }
}FUNCTION_CONFORMANCE;

typedef struct _CONNECT_REQUEST_FRAME{
    PIID  piid; //服务序号-优先级 PIID，
    uint16_t protocol_ver; //期望的协议版本号 long-unsigned，
    PROTOCOL_CONFORMANCE protocol_conformance; //期望的协议一致性块 ProtocolConformance，
    FUNCTION_CONFORMANCE function_conformance; //期望的功能一致性块 FunctionConformance，
    uint16_t frame_max_size; //客户机发送帧最大尺寸 long-unsigned，
    uint16_t recv_max_size; //客户机接收帧最大尺寸 long-unsigned，
    uint8_t  recv_max_window_size; //客户机接收帧最大窗口尺寸 unsigned，
    uint16_t handle_fame_max_size; //客户机最大可处理帧尺寸 long-unsigned，
    uint32_t expected_timeout; //期望的应用连接超时时间 double-long-unsigned，
    CONNECT_MECHANISM_INFO connect_mechanism; //认证请求对象 ConnectMechanismInfo
    _CONNECT_REQUEST_FRAME(){
        piid.value = 0;
        protocol_ver = 1;
        frame_max_size = 16 * 1024;
        recv_max_size = frame_max_size;
        recv_max_window_size = 255;
        handle_fame_max_size = frame_max_size;
        expected_timeout = 5;
    }
}CONNECT_REQUEST_FRAME;

typedef struct _FACTORY_VERSION{
    char vendor_code[4];
    char software_ver[4];
    char software_release_date[6];
    char hardware_ver[4];
    char hardware_release_date[6];
    char vendor_extend_info[8];
}FACTORY_VERSION;

typedef enum _CONNECT_RESULT{
    CONNECT_RESULT_ALLOW                 = 0,   //允许建立应用连接
    CONNECT_RESULT_PASSWORD_ERR          = 1,   //密码错误
    CONNECT_RESULT_SYMMETRIC_CIPHER_ERR  = 2,   //对称解密错误
    CONNECT_RESULT_ASYMMETRIC_CIPHER_ERR = 3,   //非对称解密错误
    CONNECT_RESULT_SIGNATURE_ERR         = 4,   //签名错误
    CONNECT_RESULT_PROTOCOL_MISMATCH     = 5,   //协议版本不匹配
    CONNECT_RESULT_OTHER_ERR             = 255, //其它错误
}CONNECT_RESULT;

typedef struct _SECURITY_DATA{
    uint8_t      RN[128];
    uint8_t      signature[128];
}SECURITY_DATA;

typedef struct _CONNECT_RESPONSE_INFO{
    CONNECT_RESULT result;        //认证结果
    SECURITY_DATA  security_data; //认证附加信息
}CONNECT_RESPONSE_INFO;

typedef struct _CONNECT_RESPONSE_FRAME{
    PIID_ACD  piid; //服务序号-优先级 PIID，
    FACTORY_VERSION factory;
    uint16_t protocol_ver; //协商的协议版本号 long-unsigned，
    PROTOCOL_CONFORMANCE protocol_conformance; //协商的协议一致性块 ProtocolConformance，
    FUNCTION_CONFORMANCE function_conformance; //协商的功能一致性块 FunctionConformance，
    uint16_t frame_max_size; //客户机发送帧最大尺寸 long-unsigned，
    uint16_t recv_max_size; //客户机接收帧最大尺寸 long-unsigned，
    uint8_t  recv_max_window_size; //客户机接收帧最大窗口尺寸 unsigned，
    uint16_t handle_fame_max_size; //客户机最大可处理帧尺寸 long-unsigned，
    uint32_t expected_timeout; //协商的应用连接超时时间 double-long-unsigned，
    CONNECT_RESPONSE_INFO connect_response; //认证请求对象 ConnectMechanismInfo
}CONNECT_RESPONSE_FRAME;

/*建立应用连接 结束*/
/*----------------------------------------------*/


/*----------------------------------------------*/
/*断开应用连接 开始*/


/*断开应用连接 结束*/
/*----------------------------------------------*/


/*----------------------------------------------*/
/*读取 开始*/


/*读取 结束*/
/*----------------------------------------------*/


/*----------------------------------------------*/
/*设置 开始*/


/*设置 结束*/
/*----------------------------------------------*/


/*----------------------------------------------*/
/*上报 开始*/


/*上报 结束*/
/*----------------------------------------------*/


/*----------------------------------------------*/
/*代理 开始*/


/*代理 结束*/
/*----------------------------------------------*/


/*----------------------------------------------*/
/*安全传输 开始*/


/*安全传输 结束*/
/*----------------------------------------------*/

typedef struct _APDU{
    uint8_t *apdu;
    uint8_t apdu_tag;
    int     apdu_len;
    uint8_t func_tag;
    PIID    piid;
    _APDU(){
        apdu = NULL;
        apdu_tag = 0;
        apdu_len = 0;
        func_tag = 0;
        piid.value = 0;
    }
    _APDU& operator=(const _APDU& data){
        if(this != &data){
            apdu = data.apdu;
            apdu_tag = data.apdu_tag;
            apdu_len = data.apdu_len;
            func_tag = data.func_tag;
            piid.value = data.piid.value;
        }
        return *this;
    }
}APDU;
/**
 * @brief 定义buf数据结构，是否考虑放到单独的文件里？还没想好。
*/
typedef struct _DLT698_BUFFER{
    uint8_t* data;
    int len;
    int segment;
    _DLT698_BUFFER(){
        data = NULL;
        len = 0;
        segment = 0;
    }
    ~_DLT698_BUFFER(){
        if(NULL != data){
            free(data);
        }
        len = 0;
        segment = 0;
    }
}DLT698_BUFFER;

#ifdef __cpluscplus
}
#endif 

#endif /* __APDU_H__ */